package com.blog.cmrpersonalblog.dto.notification.respnose;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 通知响应DTO（重构版）
 * 支持评论回复、@提及、点赞等多种通知类型的详细展示
 */
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)  // 隐藏null字段
public class NotificationResponse {
    /**
     * 通知ID
     */
    private Long id;

    /**
     * 接收通知的用户ID (敏感信息,不返回给前端)
     */
    @JsonIgnore
    private Long userId;

    /**
     * 发送通知的用户ID (敏感信息,不返回给前端)
     */
    @JsonIgnore
    private Long senderId;

    /**
     * 发送者信息
     */
    private SenderInfo sender;

    /**
     * 通知类型
     */
    private String type;

    /**
     * 通知类型名称
     */
    private String typeName;

    /**
     * 操作描述（如：回复了你的评论、赞了你的文章）
     */
    private String actionText;

    /**
     * 通知标题
     * @deprecated 该字段已废弃,语义不清晰。推荐使用 typeName + actionText 组合展示
     * 例如: "评论" + "评论了你的文章" = "评论 - 评论了你的文章"
     */
    @Deprecated
    private String title;

    /**
     * 通知内容（主要内容，如回复的内容）
     * @deprecated 该字段已废弃,固定文本信息量少。推荐使用 actionText 替代
     */
    @Deprecated
    private String content;

    /**
     * 目标类型
     */
    private String targetType;

    /**
     * 目标ID
     */
    private Long targetId;

    /**
     * 目标信息（文章、评论等）
     */
    private TargetInfo target;

    /**
     * 评论详情（仅评论/回复类型通知）
     */
    private CommentDetail commentDetail;

    /**
     * 原评论引用（仅回复类型通知）
     */
    private CommentQuote originalComment;

    /**
     * 文章信息（评论/回复通知中的文章信息）
     */
    private ArticleInfo articleInfo;

    /**
     * @提及的用户列表（仅@提及类型通知）
     */
    private List<MentionedUser> mentionedUsers;

    /**
     * 额外数据 (内部字段，包含文章标题、评论内容等详细信息,JSON格式)
     * 不应该直接暴露给前端
     */
    @JsonIgnore
    private String extraData;

    /**
     * 是否已读
     */
    private Integer isRead;

    /**
     * 阅读时间
     */
    private LocalDateTime readTime;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    // ==================== 聚合通知字段（点赞通知聚合） ====================
    // 注意：这些字段只在聚合通知中使用，其他情况为null，会被 @JsonInclude 自动隐藏

    /**
     * 发送者数量（聚合通知）
     * 用于点赞通知聚合，表示有多少人点赞
     */
    private Integer senderCount;

    /**
     * 发送者ID列表（聚合通知）
     * JSON数组格式，最多保存100个点赞者ID
     * 示例：[1001, 1002, 1003, ...]
     */
    private String senderIds;

    /**
     * 最新发送者ID（聚合通知）
     * 用于显示最新的点赞者信息
     */
    private Long lastSenderId;

    /**
     * 最后更新时间（聚合通知）
     * 每次新增点赞时更新
     */
    private LocalDateTime lastUpdateTime;

    // ==================== 内部类定义 ====================

    /**
     * 发送者信息
     */
    @Data
    public static class SenderInfo {
        /**
         * 用户ID
         */
        private Long userId;

        /**
         * 用户名
         */
        @JsonIgnore
        private String userName;

        /**
         * 昵称
         */
        private String nickName;

        /**
         * 头像
         */
        private String avatar;
    }

    /**
     * 目标信息
     * 该对象主要用于提供跳转链接,不建议用于显示标题和内容
     */
    @Data
    public static class TargetInfo {
        /**
         * 目标ID
         */
        private Long id;

        /**
         * 目标类型
         */
        private String type;

        /**
         * 目标标题/名称
         * @deprecated 语义不明确(可能是文章标题或评论内容)。
         *             推荐使用: articleInfo.title(文章标题) 或 commentDetail.content(评论内容)
         */
        @Deprecated
        private String title;

        /**
         * 目标内容摘要
         * @deprecated 语义不明确(可能是文章摘要或评论内容)。
         *             推荐使用: articleInfo.summary(文章摘要) 或 commentDetail.content(评论内容)
         */
        @Deprecated
        private String summary;

        /**
         * 目标链接 (用于跳转)
         */
        private String url;
    }

    /**
     * 评论详情（用于评论/回复通知）
     */
    @Data
    public static class CommentDetail {
        /**
         * 评论ID
         */
        private Long id;

        /**
         * 评论内容
         */
        private String content;

        /**
         * 评论者信息
         */
        private UserInfo commenter;

        /**
         * 回复的用户信息（如果是回复）
         */
        private UserInfo replyToUser;

        /**
         * 评论时间
         */
        private LocalDateTime createTime;

        /**
         * 点赞数
         */
        private Integer likeCount;

        /**
         * 回复数
         */
        private Integer replyCount;

        /**
         * 当前用户是否已点赞
         */
        private Boolean isLiked;
    }

    /**
     * 原评论引用（用于回复通知）
     */
    @Data
    public static class CommentQuote {
        /**
         * 原评论ID
         */
        private Long id;

        /**
         * 原评论内容
         */
        private String content;

        /**
         * 原评论者信息
         */
        private UserInfo commenter;

        /**
         * 原评论时间
         */
        private LocalDateTime createTime;
    }

    /**
     * 文章信息（用于评论/回复通知）
     */
    @Data
    public static class ArticleInfo {
        /**
         * 文章ID
         */
        private Long id;

        /**
         * 文章标题
         */
        private String title;

        /**
         * 文章摘要
         */
        private String summary;

        /**
         * 文章封面
         */
        private String coverImage;

        /**
         * 文章链接
         */
        private String url;
    }

    /**
     * @提及的用户信息
     */
    @Data
    public static class MentionedUser {
        /**
         * 用户ID
         */
        private Long userId;

        /**
         * 用户昵称
         */
        private String nickName;

        /**
         * 用户头像
         */
        private String avatar;
    }

    /**
     * 用户信息（通用）
     */
    @Data
    public static class UserInfo {
        /**
         * 用户ID
         */
        private Long userId;

        /**
         * 用户昵称
         */
        private String nickName;

        /**
         * 用户头像
         */
        private String avatar;
    }

    /**
     * 获取通知类型名称
     */
    public String getTypeName() {
        if (typeName != null) {
            return typeName;
        }
        switch (type) {
            case "FOLLOW":
                return "新增粉丝";
            case "LIKE_ARTICLE":
            case "LIKE_COMMENT":
                return "点赞";
            case "COLLECT":
                return "收藏";
            case "COMMENT":
                return "评论";
            case "REPLY":
                return "回复";
            case "MENTION":
                return "提及";
            case "SYSTEM":
                return "系统通知";
            default:
                return "未知";
        }
    }

}
